package com.jl.basicframework.httpservice;

import com.jl.basicframework.model.bean.HttpBean;

import java.io.IOException;

import okhttp3.Request;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

/***
 * @author 作者:姜澜
 * 时间:2022/3/15
 * 邮箱:316879104@pp.com
 * 接口简述: 调用 Retrofit 方法，将请求发送到 Web 服务器并返回响应。每个调用都会产生自己的 HTTP 请求和响应对。
 * 使用 clone 对同一个 webserver 进行多次相同参数的调用；这可用于实现轮询或重试失败的调用。
 * 调用可以与 execute 同步执行，也可以与 enqueue 异步执行。无论哪种情况，都可以随时使用取消取消呼叫。
 * 忙于写入请求或读取响应的调用可能会收到 IOException；这是按设计工作的。类型参数：<T> – 成功响应正文类型。
 */
public interface ICall<T> extends Cloneable{

    /**
     * 同步发送请求并返回其响应。
     * @return
     * @throws IOException - 如果与服务器通信时出现问题。
     *         RuntimeException - 如果在创建请求或解码响应时发生意外错误.
     */
    Response<HttpBean<T>> execute() throws IOException;

    /**
     * 异步发送请求并通知其响应的回调，或者在与服务器连接、创建请求或处理响应时发生错误
     * @param callback
     */
    void enqueue(Callback<HttpBean<T>> callback);

    /**
     * 如果此调用已执行或已入队，则返回 true。多次执行或排队调用是错误的。
     * @return
     */
    boolean isExecuted();

    /**
     * 取消此连接。将尝试取消进行中的连接，如果连接尚未执行，则不会执行。
     */
    void cancel();

    /**
     * 调用Cancel() 方法则返回 true
     * @return
     */
    boolean isCanceled();

    /**
     * 创建一个新的、相同的调用，即使这个调用已经被加入队列或执行。
     * @return
     */
    Call<HttpBean<T>> clone();

    /**
     * 原始 HTTP 请求
     * @return
     */
    Request request();
}
